import cmd from 'node-cmd';
import extend from 'extend';
import fs from 'fs';

class MinerRunningHolder {
    constructor(minerOpt) {
        this._option = minerOpt;
        this.name = minerOpt.name;
        this._configPath = minerOpt.configPath;
        try {
            const r = fs.readFileSync(this._configPath);
            this._defaultOption = JSON.parse(r);
        } catch (e) {
            this._configPath = null;
        }
    }

    start(err, command) {
        try {
            this.process = cmd.get(command || this._option.command, data => {
                console.log(data);
            });
        } catch (e) {
            console.warn(e);
            if (err && typeof err === 'function')
                err(e);
        }
    }

    stop(err) {
        try {
            this.process.kill();
        } catch (e) {
            console.warn(e);
            if (err && typeof err === 'function')
                err(e);
        }
    }

    /**
     * 切换至默认配置，如果是配置文件启动，则将配置文件还原至监控器启动时的状态，如果是命令行启动，则使用最初的命令行启动
     * @param {function} err 发生错误时的回调方法
     */
    switchToDefault(err) {
        this.stop();
        if (this._configPath) {
            fs.writeFile(this._configPath, JSON.stringify(this._defaultOption))
        }
        this.start(err);
    }

    /**
     * 使用新的配置切换矿机
     * @param newConf 新的配置文件内容（扩展）
     * @param {function} err 发生错误时的回调方法
     */
    switchOnConfig(newConf, err) {
        if (!this._configPath) {
            console.error(`矿机【${this.name}】没有设置配置文件，无法使用切换配置文件方式切换矿池。请检查配置。PS: 矿机并未停止运行。`);
            return;
        }
        this.stop();
        const config = {};
        extend(true, config, this._defaultOption, newConf);
        fs.writeFile(this._configPath, JSON.stringify(conf), (err) => {
            this.start(err);
        })
    }

    /**
     * 使用新的命令行启动矿机
     * @param {String} newCommand 新的启动命令行
     * @param {function} err 发生错误时的回调方法
     */
    switchOnCommand(newCommand, err) {
        this.stop();
        this.start(err, newCommand);
    }
}

export default MinerRunningHolder;